using System;
using System.Collections.Generic;
using System.Configuration;
using Iesi.Collections.Generic;
using METODESA.Server.Data.Exceptions;
using METODESA.Server.Data.METODESA.Entity;
using METODESA.Server.Data.METODESA.Factorys;
using METODESA.Server.Data.METODESA.Nhibernate;
using NHibernate;

namespace Metodesa.Logic
{
    public class VentaLogic
    {
        public static IList<OrdenVenta> processSearch(string search, string type, string criteria)
        {
            if (criteria == "" || search == "")
            {
                return VentasDao.getAllVentas(type);
            }
            else
            {

                switch (criteria)
                {
                    case "Codigo": return VentasDao.getVentaByCodigo(search, type);

                    case "Fecha": return VentasDao.getVentaByFecha(search, type);

                    case "Empleado": return VentasDao.getVentaByEmpleado(search, type);

                    case "Cliente": return VentasDao.getVentaByCliente(search, type);

                }

            }
            return null;
        }

        public static void add(string fecha, string empleadoId, string clienteId,string tPago)
        {

            try
            {

                OrdenVenta venta = FactoryVenta.getVenta();
                venta.Empleado = EmpleadoDao.getEmpleadoById(int.Parse(empleadoId));
                venta.Cliente = ClienteDao.getClienteById(int.Parse(clienteId));
                venta.Fecha = fecha;
                venta.TipoPago = tPago;
                VentasDao.saveEntity(venta);

            }
            catch (HibernateException e)
            {

                NHibernateHelper.GetCurrentSession().Clear(); // Quitamos el query que nos dio error
                throw new EntityCouldntBeSaved("La venta no se ha podido agregar " + e.Message);
            }

        }

        public static void edit(int id, string fecha, string empleadoId, string clienteId,string Tpago)
        {
            ITransaction myTransaction = null;

            try
            {
                myTransaction = NHibernateHelper.GetCurrentSession().BeginTransaction();
                OrdenVenta venta = VentasDao.getVentaById(id);
                Empleado empleadoViejo = venta.Empleado;
                empleadoViejo.ordenVenta.Remove(venta);
                venta.Empleado = EmpleadoDao.getEmpleadoById(int.Parse(empleadoId));
                venta.Cliente = ClienteDao.getClienteById(int.Parse(clienteId));
                venta.Fecha = fecha;
                venta.TipoPago = Tpago;
                VentasDao.updateSimple(venta);
                EmpleadoDao.updateSimple(empleadoViejo);
                myTransaction.Commit();


            }
            catch (HibernateException e)
            {
                myTransaction.Rollback();
                NHibernateHelper.GetCurrentSession().Clear(); // Quitamos el query que nos dio error
                throw new EntityCouldntBeUpdated("La venta no se ha podido modificar " + e.Message);
            }
        }

        public static void deleteDetalle(int idVenta, int idDetalle)
        {
            ITransaction myTransaction = null;

            try
            {
                NHibernateHelper.GetCurrentSession().Clear();
                OrdenVenta venta = VentasDao.getVentaById(idVenta);
                DetalleVenta detalleVenta = DetalleVentaDao.getDetalleById(idDetalle);
                myTransaction = NHibernateHelper.GetCurrentSession().BeginTransaction();
                venta.Monto = venta.Monto - detalleVenta.Precio * detalleVenta.Cantidad;
                venta.detalleVenta.Remove(detalleVenta);
                VentasDao.updateSimple(venta);
                myTransaction.Commit();
            }
            catch
            {
                if (myTransaction != null)
                    myTransaction.Rollback();
                NHibernateHelper.GetCurrentSession().Clear();

                //Todo manejar la excepcion
            }
        }

        public static OrdenVenta Close(string value)
        {
            ITransaction myTransaction = null;
            try
            {
                myTransaction = NHibernateHelper.GetCurrentSession().BeginTransaction();
                OrdenVenta venta = VentasDao.getVentaById(int.Parse(value));
                double impuesto = double.Parse(ConfigurationSettings.AppSettings["Impuesto"]);
                venta.Monto = venta.Monto + (venta.Monto*impuesto);
                venta.Estado = 1;
                VentasDao.updateSimple(venta);
                myTransaction.Commit();
                return venta;

            }
            catch (HibernateException e)
            {
                if (myTransaction != null)
                    myTransaction.Rollback();
                NHibernateHelper.GetCurrentSession().Clear();
                throw new EntityCouldntBeSaved("El detalle no se ha podido agregar " + e.Message);

            }

        }

        public static DetalleVenta AddDetalleVenta(int idProducto, string idVenta, string cantidad, string precio,out double monto)
        {
            try
            {
                DetalleVenta detalle = FactoryDetalleVenta.getDetalleVenta();
                detalle.Cantidad = int.Parse(cantidad);
                detalle.Producto = ProductoDao.getProductoById(idProducto);
                detalle.Precio = double.Parse(precio);
                OrdenVenta venta = VentasDao.getVentaById(int.Parse(idVenta));
                if (venta.detalleVenta == null)
                    venta.detalleVenta = new HashedSet<DetalleVenta>();
                venta.detalleVenta.Add(detalle);
                detalle.OrdenVenta = venta;
                venta.Monto = venta.Monto + (detalle.Cantidad * detalle.Precio);
                monto = venta.Monto;
                VentasDao.updateEntity(venta, detalle);
                return detalle;
            }
            catch (HibernateException e)
            {

                NHibernateHelper.GetCurrentSession().Clear(); // Quitamos el query que nos dio error
                throw new EntityCouldntBeSaved("El detalle no se ha podido agregar " + e.Message);

            }


        }
    }
}